<?php

namespace app\common\component;

use think\cache\driver\Redis as RedisDriver;

/**
 * redis组件
 * Class Redis
 * @package app\common\component
 */
class Redis
{
    /** @var null redis驱动单例 */
    public static $redisInstance = null;
    /** @var null redis组件单例 */
    public static $instance = null;
    /** @var string redis键值前缀-访问门阀 */
    const ACCESS_THROTTLE_PREFIX = 'access_throttle_prefix::';
    /** @var string 页面访问次数 */
    const ACCESS_NONCESTR_PREFIX = 'access_noncestr_prefix::';
    /** @var string 发送邮箱次数 */
    const ACCESS_EMAIL_PREFIX = 'access_email_prefix::';
    /** @var string swoole连接的用户池 用set */
    const SWOOLE_USER_POOL = 'swoole_user_pool';
    /** @var string 可连接的用户池 用set */
    const SWOOLE_AVAILABLE_USER_POOL = 'swoole_available_user_pool';
    /** 聊天的对应关系，可以用hash存储， 因为hash的 field可以达到 2^32 - 1个 */
    const USER_FRIEND_RELATIONSHIP = 'user_friend_relationship';
    /** @var string swoole的id与用户id的关系, 用hash */
    const SWOOLE_USER_RELATION = 'swoole_user_relation';

    /**
     * 构造函数
     * Redis constructor.
     */
    private function __construct()
    {
        $redisDriver = new RedisDriver(config('redis_config'));
        static::$redisInstance = $redisDriver->handler();
    }

    /**
     * 单例
     * @param bool $newInstance
     * @return null|static
     */
    public static function getInstance($newInstance = false)
    {
        if (is_null(static::$redisInstance) || $newInstance) {
            self::$instance = new static();
        }

        return self::$instance;
    }

    /**
     * 获取redis键名称
     * @param $prefix
     * @return string
     */
    public function getRedisName($prefix)
    {
        $argc = func_num_args();
        $argv = func_get_args();
        $suffix = '';
        for ($i = 1; $i < $argc; $i++) {
            $suffix .= '_' . $argv[$i];
        }

        $suffix = trim($suffix, '_');
        return $prefix . $suffix;
    }

    /**
     * 魔术方法，调用原生方法
     * @param $name
     * @param $arguments
     * @return mixed
     */
    public function __call($name, $arguments)
    {
        return call_user_func_array([self::$redisInstance, $name], $arguments);
    }
}